<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>队列基本介绍</title>
    </head>
    <body>
        <script>
            // 队列是遵循先进先出的规则（FIFO）
            // 队列
            class Queus {
                constructor() {
                    this.count = 0; // 数量
                    this.lowestCount = 0; // 标记位置，起始位置
                    this.items = {}; // 存放数据
                }
                /**
                 * 方法主要是包括：enqueue():向队列尾部添加一个数据
                 *              dequeue():移除队列的第一项（排在最前边的数据），并且返回被移除的数据。
                 *              peek(): 返回队列中的第一个元素————最先被添加，也是最先被移除的元素。
                 *              isEmpty():判断当前队列是不是空的。
                 *              size():返回当前队列的尺寸。
                 *
                 * */

                enqueue(element) {
                    this.items[this.count] = element;
                    this.count++;
                    //  this.lowestCount += 1;
                }

                dequeue() {
                    if (this.isEmpty()) {
                        return undefined;
                    }
                    const result = this.items[this.lowestCount];
                    delete this.items[this.lowestCount];
                    this.lowestCount++;
                    return result;
                }

                peek() {
                    if (this.isEmpty()) {
                        return undefined;
                    }
                    return this.items[this.lowestCount];
                }

                isEmpty() {
                    return this.size() === 0;
                }

                size() {
                    return this.count - this.lowestCount;
                }

                clear() {
                    this.items = {};
                    this.count = 0;
                    this.lowestCount = 0;
                }

                toString() {
                    if (this.isEmpty()) {
                        return "";
                    }
                    let objString = `${this.items[this.lowestCount]}`;
                    for (let i = this.lowestCount + 1; i < this.count; i++) {
                        objString = `${objString},${this.items[i]}`;
                    }
                    return objString;
                }
            }
        </script>
    </body>
</html>
